package village.rainbow.slipin.gcm;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import com.google.android.gcm.GCMBaseIntentService;

import village.rainbow.slipin.R;
import village.rainbow.slipin.datamodel.DataRow;
import village.rainbow.slipin.datamodel.DataRowBean;
import village.rainbow.slipin.ui.SlipinActivity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

/**
 * GCMBaseIntentService를 상속받은 클래스를 프로젝트 루트 패키지에 생성한다.
 * 클래스는 반드시 다음 조건을 충족해야 한다.
 * 
 * 1.클래스명은 GCMIntentService여야 한다.
 * 2.반드시 루트 패키지 내에 선언되어 있어아 한다.
 *  상기 1,2 조건을 만족해야 하는 이유는 라이브러리 내에서 해당 이름으로
 *  자바의 리플렉션을 통해 클래스를 생성/시작하게 되어 있다.
 * @author Leminity
 *
 */
public class GCMIntentService extends GCMBaseIntentService {
	
	/**
	 * GCM Server로부터 발급받은 Project ID를 통해 SuperClass인
	 * GCMBaseIntentService를 생성해야한다. 
	 */


	public GCMIntentService() {
		super("stone-outpost-623");
		// TODO Auto-generated constructor stub
	}

	@Override
	protected void onError(Context arg0, String arg1) {
		// TODO Auto-generated method stub
		/**
		 * GCM 오류 발생 시 처리해야 할 코드를 작성한다.
		 * ErrorCode에 대해선 GCM 홈페이지와 GCMConstants 내 static variable 참조한다. 
		 */
		Log.i("onError", arg1);

	}

	@Override
	protected void onMessage(Context arg0, Intent arg1) {
//		// TODO Auto-generated method stub
//		/**
//		 * GCMServer가 전송하는 메시지가 정상 처리 된 경우 구현하는 메소드이다.
//		 * Notification, 앱 실행 등등 개발자가 하고 싶은 로직을 해당 메소드에서 구현한다.
//		 * 전달받은 메시지는 Intent.getExtras().getString(key)를 통해 가져올 수 있다.
//		 */
//		//Log.i("onMessage", arg1.getDataString());
//		StringBuilder builder = new StringBuilder();
//
//		Bundle bundle = arg1.getExtras();
//		for(String key: bundle.keySet()){
//			Object value = bundle.get(key);
//			builder.append(key + " : " + value);
//			builder.append("\r\n");
//		}
//
//		Log.i("TEST", builder.toString());
//
//		try{
//			String tit = URLDecoder.decode(bundle.getString("title"), "UTF-8");
//			String msg = URLDecoder.decode(bundle.getString("content"), "UTF-8");
//			String imt = URLDecoder.decode(bundle.getString("img_url"), "UTF-8");
//
//			DbHelper helper = DbHelper.getInstance(arg0);
//			String currentTime = StringUtil.currentDate("yyyyMMddHHmmss");
//			helper.insertMainTable(currentTime, tit, msg, imt);
//			
//			DataRow result = helper.selectMainRow(currentTime);
//			addNotification(arg0, bundle, result);	
//		}catch(Exception e){
//			e.printStackTrace();
//		}
		
	}

	private void addNotification(Context context, Bundle bundle, DataRow result) throws UnsupportedEncodingException {

		Intent i = new Intent();
		i.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
		i.setClass(context, SlipinActivity.class);
		i.putExtra("DATA", new DataRowBean(result));
		PendingIntent pi = PendingIntent.getActivity( context, 0, i, PendingIntent.FLAG_ONE_SHOT );
		
		long[] vibraPattern = {0, 500, 250, 500 };

		String tit = URLDecoder.decode(bundle.getString("title"), "UTF-8");
		String msg = URLDecoder.decode(bundle.getString("content"), "UTF-8");

		Notification.Builder builder = new Notification.Builder(context);
		builder.setSmallIcon(R.drawable.ic_launcher);
		builder.setTicker(tit);
		builder.setContentTitle(tit);
		builder.setContentText(msg);
		builder.setVibrate(vibraPattern);
		//builder.setFullScreenIntent( pi , true );
		builder.setContentIntent(pi);
		//builder.setStyle(Notification.Style);
		Notification noti = builder.build();

		NotificationManager notificationManager = 
				(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		notificationManager.notify( 0 , noti ); 

	}

	@Override
	protected void onRegistered(Context arg0, String regId) {
		// TODO Auto-generated method stub
		/**
		 * GCMRegistrar.getRegistrationId(context)가 실행되어 registrationId를 발급받은 경우 해당 메소드가 콜백된다.
		 * 메시지 발송을 위해 regId를 서버로 전송하도록 하자.
		 */
		Log.i("onRegistered", regId);

		SendRegistIdToServer gcm = new SendRegistIdToServer(this);
		gcm.send();

	}

	@Override
	protected void onUnregistered(Context arg0, String arg1) {
		// TODO Auto-generated method stub
		/**
		 * GCMRegistrar.unregister(context) 호출로 해당 디바이스의 registrationId를 해지요청한 경우 해당 메소드가 콜백된다.
		 */
		Log.i("onUnregistered", arg1);

	}

}
